+SPIP-Core spip-3.0.19 -> spip-3.0.20 23 juin 2015
+-------------------------------------------------------------
+r22106 | ben | (sam. 09 mai 2015) | 3.0.20 dev
+r22111 | cedric | (sam. 09 mai 2015) | #3418 : loger les creations de table pour debusquer le bug
+r22112 | cedric | (sam. 09 mai 2015) | #3418 : purger les opcode cache y compris sur php-fpm (a valider) / Credits pour le patch https://www.drupal.org/node/779482
+r22121 | cedric | (dim. 10 mai 2015) | Report de r22115 : realpath pour faire un clear opcode cache
+r22122 | cedric | (dim. 10 mai 2015) | Report de r22116 : #3418 : Octave utilise une configuration foireuse de opcode cache, qui persiste 2s apres modification du fichier sans possibilite de l'invalider manuellement. On essaye donc de detecter cette configuration et de faire un sleep() le temps que le cache soit invalide
+r22123 | cedric | (dim. 10 mai 2015) | Report de r22118 : Affectation de variable inutile (inutilisée) dans r22116.
+r22124 | cedric | (dim. 10 mai 2015) | Report de r22119 : Complement a r22116 : deplacer les de code dans une fonction qui peut resservir dans un plugin si necessaire
+r22125 | cedric | (dim. 10 mai 2015) | Report de r22120 : Commenter les logs inutiles de r22111, on conserve la verification et seconde tentative de creation de table en cas d'echec
+r22155 | erational | (lun. 18 mai 2015) | un warning de moins.
+r22204 | b_b | (ven. 05 juin 2015)| Report de r22203 / Fix #3440 : éviter la disparition du texte du troisième onglet de l'installation sous firefox win$ (merci à Franck pour le signalement)
+r22208 | b_b | (mar. 09 juin 2015)| report de r22201 / Fixe #3418 : complément à r22119 ajouter une seconde à la durée de opcache.revalidate_freq, sans quoi on retombe dans le cache
+r22246 | cedric | (ven. 19 juin 2015)| Report de r22245 : une option mtime sur purger_repertoire pour supprimer uniquement les fichiers plus anciens que filemtime donne
+r22247 | rasta | (ven. 19 juin 2015)| Charger la l'API autoriser avant de l'utiliser… On rappelle que SPIP n'utilise pas d'autoload, et que donc on DOIT TOUJOURS penser à charger les API avant de les utiliser. :)
+r22252 | toutati | (dim. 21 juin 2015)| un petit {tout} qui permet d'afficher la liste des traductions, même si l'article a une rubrique en -1 (cas du plugin pages uniques)
+
+SPIP-plugins-dist spip-3.0.19 -> spip-3.0.20 23 juin 2015
+-------------------------------------------------------------
+r89160 | eric | (ven. 08 mai 2015) | Le décideur prend la première version compatible des plugins dépendants si plusieurs sont disponibles. Autant prendre la version la plus élevée.
+r89163 | eric | (ven. 08 mai 2015) | oubli d'incrément.
+r89165 | cedric | (ven. 08 mai 2015) | Fix https://core.spip.net/issues/3398 : date_thread ne doit etre mis a jour que si le message est publie
+r89169 | franck | (ven. 08 mai 2015) | Ce n'est plus http://core.spip.org mais https://core.spip.net
+r89230 | cedric | (sam. 09 mai 2015) | Report de r89229 : Fix https://core.spip.net/issues/2899 : erreur 404 mal geree en urls propres
+r89281 | marcimat | (dim. 10 mai 2015) | Corriger #3416 : ne pas afficher obsolète un plugin local en présence d'une version plus élevée du même plugin, mais non compatible avec ce SPIP.Notons que le terme 'obsolète' ne convient pas vraiment. En effet, dans le cas suivants, tous 2 compatibles avec notre SPIP :A : prefixe TOTO | v1.0.0 | stableB : prefixe TOTO | v1.1.0 | stableC : prefixe TOTO | v1.1.1 | testAlors - A est considéré obsolète (OK)- B n'est pas considéré obsolète (OK)- C est considéré obsolète (hum…)En fait un terme 'prioritaire' sur B à true, et false sur les autres aurait été plus adapté. Parce que C n'est pas tellement obsolète,juste plus à jour, mais d'un état inférieur.
+r89311 | marcimat | (mar. 12 mai 2015) | Report de r85634 : Eviter des "Warning: Illegal string offset..." (Oxymore)(JandB)
+r89345 | marcimat | (jeu. 14 mai 2015) | Report de r89344 : Fermer véritablement #3398 car la correction r89165 n'avait pas vu un piège et créait un beau warning :$t, censé être un tableau, était réaffecté au dessus pour recevoir l'identifiant du thread.On nomme pour ce cas correctement la variable.
+r89347 | marcimat | (jeu. 14 mai 2015) | Report de r89346 : Ferme #3443 et suite de #3380 , qui complète r89155 (et 89157) : il faut que l'autorisation d'associer des documents, tout commele fait déjà la nouvelle autorisation de dissocier des documents, prenne en compte les identifiants négatifs.Ils correspondent à l'ajout d'un document sur un nouvel article encore en édition et non encore enregistré (pas d'id_article connu),ce qui affecte le document avec 0-$id_auteur qui l'a envoyé.
+r89691 | marcimat | (mer. 27 mai 2015) | Correction d'un cas très particulier lors de l'installation de SPIP et du plugin organiseur, si un pluginappelle la fonction 'creer_base()' avant l'installation du plugin organiseur. (Cas qui peut arriversi quelqu'un ajoute au moins un plugin dans plugins-dist qui fait cela, avant d'avoir installé SPIP)Dans ce cas, la table 'spip_messages' est déjà créée, et Organiseur croit que l'on vient d'une mise à jourd'un vieux SPIP. Et à ce moment là, il ne crée pas les colonnes nécessaires (imessage et messagerie) dans SPIP auteurs,mais par contre il fait toutes les procédures de mises à jour.Du coup, on ajoute une procédure de mise à jour qui peut créer ces champs s'ils manquent.Corrige une erreur «Critère inconnu =» sur le squelettes prive/objets/liste/auteurs-enligne à l'installation.À noter que ce squelette dans SPIP fait appel à la colonne imessage depuis https://core.spip.net/projects/spip/repository/revisions/21401 , alors que ce champ estdéclaré dans ce plugin. Peut être faudrait il surcharger le squelette dans ce plugin pour permettre à SPIP de pouvoir fonctionner sans.
+r89923 | real3t | (ven. 05 juin 2015)| Ce bouton actualiser la liste des plugins était tellement bas que j'étais passé à côté (merci Marcimat pour le signalement)
+r89933 | real3t | (ven. 05 juin 2015)| Revert à la demande d'Eric : une boite d'info, c'est dans la navigation (bon, moi, je pense que c'est une boite de raccourcis, mais...)
+r90060 | b_b | (mar. 09 juin 2015)| Report de r90059Fix https://core.spip.net/issues/3452 : rétablir la possibilité de joindre un document sur un forumSuite à r89155, il faut définir les autorisation autoriser_forum_associerdocuments_dist et autoriser_forum_dissocierdocuments_dist pour permettre de lier/délier un document à un message de forum. Les deux fonctions renvoient toujours true pour que cela fonctionne, voir remarques ici https://core.spip.net/issues/3452#note-4
+r90353 | cedric | (ven. 19 juin 2015)| Report de r90352 : Detection des flooders : quand un utilisateur comptabilise plus de 200 visites d'articles dans une visite,on note son IP dans le dossier tmp/flood/Au bout de 24H (redefinissable via la constante _IP_FLOOD_TTL) on la supprime de tmp/flood/Ces IP reperees peuvent ensuite etre considerees comme des BOT ou meme kickee temporairement, au choix, action a ajouter dans le mes_options.php par exemple
+r90358 | real3t | (ven. 19 juin 2015)| Report de [90354] et [90356] : Retour sur [89155] : il est autorise d'associer des documents a d'autres documents, certains plugins le font deja, evitons la casse pas trop justifiee (b_b, kent1, RealET)
+
SPIP-Core spip-3.0.17 -> spip-3.0.19 08 mai 2015
-------------------------------------------------------------
-
r21519 | ben | (mer. 13 août 2014) | Allez reparton(ton) en dev pour un tour
r21529 | ben | (jeu. 21 août 2014) | Pas d'onglet dans le nom de la fonction d'autorisation. Permet à un redacteur de pouvoir remodifier la langue et la couleur dans l'espace privé
r21531 | eric | (ven. 22 août 2014) | Eviter des "illegal offset" si l'utilisateur n'est pas connecté (déjà corrigé en 3.1).
* @return void
*/
function creer_ou_upgrader_table($table,$desc,$autoinc,$upgrade=false,$serveur='') {
+ #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
$sql_desc = $upgrade ? sql_showtable($table,true,$serveur) : false;
+ #if (!$sql_desc) $sql_desc = false;
+ #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
if (!$sql_desc) {
if ($autoinc==='auto')
$autoinc = base_determine_autoinc($table,$desc);
+ #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
+ // verifier la bonne installation de la table (php-fpm es-tu la ?)
+ $sql_desc = sql_showtable($table,true,$serveur);
+ #if (!$sql_desc) $sql_desc = false;
+ #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
+ if (!$sql_desc){
+ // on retente avec un sleep ?
+ sleep(1);
+ sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
+ $sql_desc = sql_showtable($table,true,$serveur);
+ #if (!$sql_desc) $sql_desc = false;
+ #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
+ if (!$sql_desc){
+ spip_log("Echec creation table $table","maj"._LOG_CRITIQUE);
+ }
+ }
}
else {
+ #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
// ajouter les champs manquants
// on ne supprime jamais les champs, car c'est dangereux
// c'est toujours a faire manuellement
// liberer le verrou et fermer le fichier
@chmod($fichier, _SPIP_CHMOD & 0666);
if ($ok) {
- if (!defined('_OPCACHE_BUG') AND function_exists('opcache_invalidate'))
- opcache_invalidate($fichier, true);
+ spip_clear_opcode_cache(realpath($fichier));
return $ok;
}
}
* @param null $filename
*/
function spip_clearstatcache($clear_realpath_cache = false, $filename=null){
- return (version_compare(PHP_VERSION, '5.3.0') >= 0)?
- clearstatcache($clear_realpath_cache,$filename):clearstatcache();
+ if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) {
+ // Below PHP 5.3, clearstatcache does not accept any function parameters.
+ return clearstatcache();
+ }
+ else {
+ return clearstatcache($clear_realpath_cache, $filename);
+ }
+
+}
+
+
+/**
+ * Invalidates a PHP file from any active opcode caches.
+ *
+ * If the opcode cache does not support the invalidation of individual files,
+ * the entire cache will be flushed.
+ * kudo : http://cgit.drupalcode.org/drupal/commit/?id=be97f50
+ *
+ * @param string $filepath
+ * The absolute path of the PHP file to invalidate.
+ */
+function spip_clear_opcode_cache($filepath) {
+ spip_clearstatcache(TRUE, $filepath);
+
+ // Zend OPcache
+ if (function_exists('opcache_invalidate')) {
+ opcache_invalidate($filepath, TRUE);
+ }
+ // APC.
+ if (function_exists('apc_delete_file')) {
+ // apc_delete_file() throws a PHP warning in case the specified file was
+ // not compiled yet.
+ // @see http://php.net/apc-delete-file
+ @apc_delete_file($filepath);
+ }
}
-/*
+/**
+ * si opcache est actif et en mode validate_timestamps
+ * le timestamp ne sera checke qu'apres revalidate_freq s
+ * il faut donc attendre ce temps la pour etre sur qu'on va bien beneficier de la recompilation
+ * NB c'est une config foireuse deconseillee de opcode cache mais malheureusement utilisee par Octave
+ * cf http://stackoverflow.com/questions/25649416/when-exactly-does-php-5-5-opcache-check-file-timestamp-based-on-revalidate-freq
+ * et http://wiki.mikejung.biz/PHP_OPcache
+ *
+ * Ne fait rien en dehors de ce cas
+ *
+ */
+function spip_attend_invalidation_opcode_cache(){
+ if (function_exists('opcache_get_configuration')
+ AND @ini_get('opcache.enable')
+ AND @ini_get('opcache.validate_timestamps')
+ AND $duree = @ini_get('opcache.revalidate_freq') ) {
+ sleep($duree+1);
+ }
+}
+
+/**
* Suppression complete d'un repertoire.
*
* http://www.php.net/manual/en/function.rmdir.php#92050
-// Utilisee pour vider le cache depuis l'espace prive
-// (ou juste les squelettes si un changement de config le necessite)
-// si $atime est passee en argument, ne pas supprimer ce qui a servi
-// plus recemment que cette date (via fileatime)
-// retourne le nombre de fichiers supprimes
-// http://doc.spip.org/@purger_repertoire
+/**
+ * Purge un répertoire de ses fichiers
+ *
+ * Utilisée entre autres pour vider le cache depuis l'espace privé
+ *
+ * @uses supprimer_fichier()
+ *
+ * @param string $dir
+ * Chemin du répertoire à purger
+ * @param array $options
+ * Tableau des options. Peut être :
+ *
+ * - atime : timestamp pour ne supprimer que les fichiers antérieurs
+ * à cette date (via fileatime)
+ * - mtime : timestamp pour ne supprimer que les fichiers antérieurs
+ * à cette date (via filemtime)
+ * - limit : nombre maximum de suppressions
+ * @return int
+ * Nombre de fichiers supprimés
+**/
function purger_repertoire($dir, $options=array()) {
$handle = @opendir($dir);
if (!$handle) return;
if ($fichier[0] == '.') continue;
$chemin = "$dir/$fichier";
if (is_file($chemin)) {
- if (!isset($options['atime'])
- OR (@fileatime($chemin) < $options['atime'])) {
+ if ( (!isset($options['atime']) OR (@fileatime($chemin) < $options['atime']))
+ AND (!isset($options['mtime']) OR (@filemtime($chemin) < $options['mtime']))
+ ) {
supprimer_fichier($chemin);
$total ++;
}
// generer le fichier _CACHE_PIPELINE
pipeline_precompile();
- // lancer et initialiser les nouveaux crons !
- include_spip('inc/genie');
- genie_queue_watch_dist();
+ // attendre eventuellement l'invalidation du cache opcode
+ spip_attend_invalidation_opcode_cache();
+
+ if (spip_connect()) {
+ // lancer et initialiser les nouveaux crons !
+ include_spip('inc/genie');
+ genie_queue_watch_dist();
+ }
return ($GLOBALS['meta']['plugin'] != $actifs_avant);
}
ecrire_fichier($nom,
'<'.'?php' . "\n" . $comment ."\nif (defined('_ECRIRE_INC_VERSION')) {\n". $contenu . "}\n?".'>');
}
-?>
+
$desc = lister_tables_objets_sql($table);
if (!isset($desc['statut_textes_instituer']))
return $inser_puce;
-
+
+ include_spip('inc/autoriser');
// cas ou l'on a un parent connu (devrait disparaitre au profit du second cas plus generique)
if ($id_rubrique){
if (!autoriser('publierdans', 'rubrique', $id_rubrique))
if (!defined('_VAR_MODE')) define('_VAR_MODE',$_GET['var_mode']);
break;
}
+ if (isset($GLOBALS['visiteur_session']['nom']))
spip_log($GLOBALS['visiteur_session']['nom']
. " "._VAR_MODE);
}
// pour specifier les versions de SPIP necessaires
// il faut s'en tenir a un nombre de decimales fixe
// ex : 2.0.0, 2.0.0-dev, 2.0.0-beta, 2.0.0-beta2
-$spip_version_branche = "3.0.19";
+$spip_version_branche = "3.0.20";
// version des signatures de fonctions PHP
// (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
$spip_version_code = 17873;
<paquet
prefix="spip"
categorie="outil"
- version="3.0.19"
+ version="3.0.20"
etat="stable"
compatibilite="];["
schema="19268"
),
$c);
- $t = $t["id_thread"];
+ $id_thread = $t["id_thread"];
$cles = array();
foreach (array('id_objet', 'objet') as $k) {
if (isset($c[$k]) AND $c[$k]) $cles[$k] = $c[$k];
// Modification des id_article etc
// (non autorise en standard mais utile pour des crayons)
// on deplace tout le thread {sauf les originaux}.
- if (count($cles) AND $t) {
- spip_log("update thread id_thread=$t avec ".var_export($cles,1),'forum.'. _LOG_INFO_IMPORTANTE);
- sql_updateq("spip_forum", $cles, "id_thread=".intval($t)." AND statut!='original'");
+ if (count($cles) AND $id_thread) {
+ spip_log("update thread id_thread=$id_thread avec ".var_export($cles,1),'forum.'. _LOG_INFO_IMPORTANTE);
+ sql_updateq("spip_forum", $cles, "id_thread=".$id_thread." AND statut!='original'");
// on n'affecte pas $r, car un deplacement ne change pas l'auteur
}
- // s'il y a vraiment eu une modif, on
- // enregistre le nouveau date_thread
- if ($err==='') {
+ // s'il y a vraiment eu une modif et que le message est public
+ // on enregistre le nouveau date_thread
+ if ($err==='' AND $t['statut'] == 'publie') {
// on ne stocke ni le numero IP courant ni le nouvel id_auteur
// dans le message modifie (trop penible a l'usage) ; mais du
// coup attention a la responsabilite editoriale
*/
// & meme ca ca pourrait etre optionnel
- sql_updateq("spip_forum", array("date_thread" => date('Y-m-d H:i:s')), "id_thread=".$t);
+ sql_updateq("spip_forum", array("date_thread" => date('Y-m-d H:i:s')), "id_thread=".$id_thread);
}
}
}
return false;
}
+/**
+ * Autorisation d'association de documents sur des forum
+ *
+ * Toujours
+ *
+ * @param string $faire Action demandée
+ * @param string $type Type d'objet sur lequel appliquer l'action
+ * @param int $id Identifiant de l'objet
+ * @param array $qui Description de l'auteur demandant l'autorisation
+ * @param array $opt Options de cette autorisation
+ * @return bool true s'il a le droit, false sinon
+ */
+function autoriser_forum_associerdocuments_dist($faire, $type, $id, $qui, $opt) {
+ return true;
+}
+
+/**
+ * Autorisation de dissociation de documents sur des forum
+ *
+ * Toujours
+ *
+ * @param string $faire Action demandée
+ * @param string $type Type d'objet sur lequel appliquer l'action
+ * @param int $id Identifiant de l'objet
+ * @param array $qui Description de l'auteur demandant l'autorisation
+ * @param array $opt Options de cette autorisation
+ * @return bool true s'il a le droit, false sinon
+ */
+function autoriser_forum_dissocierdocuments_dist($faire, $type, $id, $qui, $opt) {
+ return true;
+}
+
/**
* Autoriser a participer au forum des admins
*
<paquet
prefix="forum"
categorie="communication"
- version="1.8.37"
+ version="1.8.40"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/forum-32.png"
* @return bool
*/
function autoriser_associerdocuments_dist($faire, $type, $id, $qui, $opt){
- if ($type=='document') return false; // pas de document sur les documents
+ // cas particulier (hack nouvel objet)
+ if (intval($id)<0 AND $id==-$qui['id_auteur']){
+ return true;
+ }
return autoriser('modifier',$type,$id,$qui,$opt);
}
* @return bool
*/
function autoriser_dissocierdocuments_dist($faire, $type, $id, $qui, $opt){
- if ($type=='document') return false; // pas de document sur les documents
- // cas particulier
+ // cas particulier (hack nouvel objet)
if (intval($id)<0 AND $id==-$qui['id_auteur']){
return true;
}
return autoriser('modifier',$type,$id,$qui,$opt);
-}
\ No newline at end of file
+}
<paquet
prefix="medias"
categorie="multimedia"
- version="2.7.64"
+ version="2.7.66"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/portfolio-32.png"
$tables[]['tables_jointures'][]= 'mots';
// cas particulier des auteurs et mots : declarer explicitement mots_liens comme jointure privilegiee
- // cf http://core.spip.org/issues/2329
+ // cf https://core.spip.net/issues/2329
$tables['spip_auteurs']['tables_jointures'][]= 'mots_liens';
$tables['spip_auteurs']['tables_jointures'][]= 'mots';
$tables['spip_mots']['tables_jointures'][]= 'mots_liens';
$maj = array();
$maj['create'] = array(
- array('maj_tables',array('spip_messages')),
- array('sql_alter','TABLE spip_auteurs ADD imessage VARCHAR(3)'),
- array('sql_alter','TABLE spip_auteurs ADD messagerie VARCHAR(3)'),
+ array('maj_tables', array('spip_messages', 'spip_auteurs')),
);
$maj['1.1.0'] = array(
array('sql_updateq',"spip_messages",array('statut'=>'prepa'),"statut='redac'"),
- array('sql_alter',"TABLE spip_messages ADD destinataires text DEFAULT '' NOT NULL"),
+ array('maj_tables', array('spip_messages')), // champ destinataires
);
$maj['1.1.1'] = array(
array('sql_alter',"TABLE spip_messages CHANGE id_auteur id_auteur bigint(21) DEFAULT 0 NOT NULL"),
);
+ $maj['1.1.2'] = array(
+ array('maj_tables', array('spip_auteurs')) // champs messagerie & imessage (parfois absents)
+ );
+
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
-?>
\ No newline at end of file
+?>
<paquet
prefix="organiseur"
categorie="date"
- version="0.8.11"
+ version="0.8.12"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/calendrier-32.png"
- schema="1.1.1"
+ schema="1.1.2"
>
<nom>Organiseur</nom>
$valeurs = array(
'id_petition' => $id_petition,
'id_article' => $id_article, # pour compat
- 'session_nom' => sinon($GLOBALS['visiteur_session']['session_nom'],
- $GLOBALS['visiteur_session']['nom']),
- 'session_email'=> sinon($GLOBALS['visiteur_session']['session_email'],
- $GLOBALS['visiteur_session']['email']),
+ 'session_nom' => isset($GLOBALS['visiteur_session']['session_nom'])?$GLOBALS['visiteur_session']['session_nom']:(isset($GLOBALS['visiteur_session']['nom'])?$GLOBALS['visiteur_session']['nom']:''),
+ 'session_email'=> isset($GLOBALS['visiteur_session']['session_email'])?$GLOBALS['visiteur_session']['session_email']:(isset($GLOBALS['visiteur_session']['email'])?$GLOBALS['visiteur_session']['email']:''),
'signature_nom_site'=>'',
'signature_url_site'=>'http://',
'_texte'=>$r['texte'],
$t = entites_html($t); // tres laid, en cas d'erreur
// supprimer un <li></li> provenant d'un <li> ouvrant seul+safehtml
- // cf http://core.spip.org/issues/2201
+ // cf https://core.spip.net/issues/2201
$t = str_replace("<li></li>","",$t);
return $t;
#spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
#spip_query("UPDATE spip_referers SET visites_jour=0");
// version 4 fois plus rapide que la premiere, en une seule requete
- // ATTENTION : peut poser probleme cf http://core.spip.org/issues/2505
+ // ATTENTION : peut poser probleme cf https://core.spip.net/issues/2505
sql_alter("TABLE spip_referers DROP visites_veille,
CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
}
}
-//
-// Calcule les stats en plusieurs etapes
-//
-// http://code.spip.net/@genie_visites_dist
+/**
+ * Nettoyer les IPs des flooders 24H apres leur dernier passage
+ */
+function visites_nettoyer_flood(){
+ if (is_dir($dir=_DIR_TMP.'flood/')){
+ include_spip('inc/invalideur');
+ if (!defined('_IP_FLOOD_TTL')) define('_IP_FLOOD_TTL',24*3600); // 24H par defaut
+ $options = array(
+ 'mtime' => $_SERVER['REQUEST_TIME'] - _IP_FLOOD_TTL,
+ );
+ purger_repertoire($dir,$options);
+ }
+}
+
+
+/**
+ * Cron de calcul de statistiques des visites
+ *
+ * Calcule les stats en plusieurs étapes
+ * @uses calculer_visites()
+ *
+ * @param int $t
+ * Timestamp de la dernière exécution de cette tâche
+ * @return int
+ * Positif si la tâche a été terminée, négatif pour réexécuter cette tâche
+**/
function genie_visites_dist($t) {
$encore = calculer_visites($t);
if ($encore)
return (0 - $t);
+ // nettoyer les IP des floodeurs quand on a fini de compter les stats
+ visites_nettoyer_flood();
+
return 1;
}
?>
<paquet
prefix="stats"
categorie="statistique"
- version="0.4.27"
+ version="0.4.28"
etat="stable"
compatibilite="[3.0.0;3.1.*]"
logo="prive/themes/spip/images/statistique-32.png"
ecrire_fichier($fichier, serialize($content));
}
+ else {
+ $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
+ @touch($flood);
+ }
}
?>
* tableau de description du paquet le plus récent sinon
*/
function chercher_plugin_compatible($prefixe, $version) {
-
+ $plugin = array();
+
// on choisit en priorite dans les paquets locaux !
$locaux = $this->infos_courtes(array(
'pl.prefixe=' . sql_quote($prefixe),
'pa.obsolete=' . sql_quote('non'),
'pa.id_depot='.sql_quote(0)), true);
if ($locaux and isset($locaux['p'][$prefixe]) and count($locaux['p'][$prefixe]) > 0) {
+ $v = '000.000.000';
foreach ($locaux['p'][$prefixe] as $new) {
if (plugin_version_compatible($version, $new['v'])
- and svp_verifier_compatibilite_spip($new['compatibilite_spip']) ){
- return $new;
+ and svp_verifier_compatibilite_spip($new['compatibilite_spip'])
+ and ($new['v'] > $v)){
+ $plugin = $new;
+ $v = $new['v'];
}
}
}
-
- // sinon dans les paquets distants
- $distants = $this->infos_courtes(array(
- 'pl.prefixe=' . sql_quote($prefixe),
- 'pa.obsolete=' . sql_quote('non'),
- 'pa.id_depot>'.sql_quote(0)), true);
- if ($distants and isset($distants['p'][$prefixe]) and count($distants['p'][$prefixe]) > 0) {
- foreach ($distants['p'][$prefixe] as $new) {
- if (plugin_version_compatible($version, $new['v'])
- and svp_verifier_compatibilite_spip($new['compatibilite_spip']) ){
- return $new;
+
+ if (!$plugin) {
+ // sinon dans les paquets distants
+ $distants = $this->infos_courtes(array(
+ 'pl.prefixe=' . sql_quote($prefixe),
+ 'pa.obsolete=' . sql_quote('non'),
+ 'pa.id_depot>'.sql_quote(0)), true);
+ if ($distants and isset($distants['p'][$prefixe]) and count($distants['p'][$prefixe]) > 0) {
+ $v = '000.000.000';
+ foreach ($distants['p'][$prefixe] as $new) {
+ if (plugin_version_compatible($version, $new['v'])
+ and svp_verifier_compatibilite_spip($new['compatibilite_spip'])
+ and ($new['v'] > $v)){
+ $plugin = $new;
+ $v = $new['v'];
+ }
}
}
}
-
- return false;
+
+ return ($plugin ? $plugin : false);
}
if ($ids_plugin) {
$where[] = sql_in('pl.id_plugin', $ids_plugin);
}
-
+
// comme l'on a de nouveaux paquets locaux...
// certains sont peut etre devenus obsoletes
// parmis tous les plugins locaux presents
// concernes par les memes prefixes que les plugins ajoutes.
$obsoletes = array();
$changements = array();
-
+
$paquets = sql_allfetsel(
- array('pa.id_paquet', 'pl.prefixe', 'pa.version', 'pa.etatnum', 'pa.obsolete'),
+ array('pa.id_paquet', 'pl.prefixe', 'pa.version', 'pa.etatnum', 'pa.obsolete', 'pa.compatibilite_spip'),
array('spip_paquets AS pa', 'spip_plugins AS pl'),
$where);
+ // L'obsolescence doit tenir compte de la compatibilité avec notre version de SPIP en cours
+ foreach ($paquets as $c => $p) {
+ $paquets[$c]['compatible'] = plugin_version_compatible($p['compatibilite_spip'], $GLOBALS['spip_version_branche'], 'spip');
+ }
+
foreach ($paquets as $c => $p) {
$obsoletes[$p['prefixe']][] = $c;
- // si 2 paquet locaux ont le meme prefixe, mais pas la meme version,
+ // si 2 paquet locaux ont le meme prefixe,
+ // sont compatibles avec notre SPIP,
+ // mais pas la meme version,
// l'un est obsolete : la version la plus ancienne
// Si version et etat sont egaux, on ne decide pas d'obsolescence.
if (count($obsoletes[$p['prefixe']]) > 1) {
foreach ($obsoletes[$p['prefixe']] as $cle) {
if ($cle == $c) continue;
+ if (!$paquets[$c]['compatible']) continue;
// je suis plus petit qu'un autre
if (spip_version_compare($paquets[$c]['version'], $paquets[$cle]['version'], '<')) {
// je suis plus grand ou egal a un autre...
else {
- // je suis plus strictement plus grand a un autre...
+ // je suis strictement plus grand qu'un autre...
if (spip_version_compare($paquets[$c]['version'], $paquets[$cle]['version'], '>')) {
// si mon etat est meilleur, rendre obsolete les autres
if ($paquets[$c]['etatnum'] >= $paquets[$cle]['etatnum']) {
<paquet
prefix="svp"
categorie="maintenance"
- version="0.80.22"
+ version="0.80.26"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="svp-64.png"
<paquet
prefix="urls"
categorie="statistique"
- version="1.4.25"
+ version="1.4.26"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/url-32.png"
} else {
// Si ca ressemble a une URL d'objet, ce n'est pas la home
// et on provoque un 404
- if (preg_match(',^.*/[^\.]+(\.html)?$,', $url)) {
+ if (preg_match(',^[^\.]+(\.html)?$,', $url)) {
$entite = '404';
$contexte['erreur'] = '';
</tr>
</thead>
<tbody>
- <BOUCLE_liste_art(ARTICLES){id_trad}{statut==.*}{where?}{recherche?}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,10}}{!lang_select}>
+ <BOUCLE_liste_art(ARTICLES){id_trad}{statut==.*}{tout}{where?}{recherche?}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,10}}{!lang_select}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class='statut'>[(#STATUT|puce_statut{article,#ID_ARTICLE,#ID_RUBRIQUE})]</td>
<td class="trad">[(#ENV{id_trad}|=={#ID_ARTICLE}|oui)[(#CHEMIN_IMAGE{langue-16.png}|balise_img)]]
#infos_etapes { height: 63px; overflow: hidden; margin: 0; padding: 0; padding-left: 10px; background: #8c8c8c url(images/degrade-etapes-clair-left.gif) no-repeat right top; text-align: left; list-style: none; }
#infos_etapes.infos_etape_4 { background-image: url(images/degrade-etapes-vert-left.gif); background-color: green; }
#infos_etapes li { float: left; margin-left: -28px; padding-left: 29px; background: url(images/degrade-etapes-fonce-left.gif) no-repeat left top; color: #555; text-align: left; font-size: .9em; line-height: 1.05em; }
-#infos_etapes li .fond { width: 100px; height: 69px; padding-right: 30px; padding-top: 10px; background: url(images/degrade-etapes-fonce-left.gif) no-repeat -30px top; }
+#infos_etapes li .fond { width: 105px; height: 69px; padding-right: 25px; padding-top: 10px; background: url(images/degrade-etapes-fonce-left.gif) no-repeat -30px top; }
#infos_etapes li em {float:left;position:absolute;top:-1000px;}
#infos_etapes li span.numero_etape { float: left; display: block; height: 50px; margin-left: -10px; padding: 7px 3px 0 3px; font-weight: bold; font-size: 3em; }
#infos_etapes li.on { background-image: url(images/degrade-etapes-vert-left.gif); color: #fff; font-weight: bold; }
<svn_revision>
<text_version>
-Origine: svn://trac.rezo.net/spip/tags/spip-3.0.19
-Revision: 22089
-Dernier commit: 2015-05-09 01:22:56 +0200
+Origine: svn://trac.rezo.net/spip/tags/spip-3.0.20
+Revision: 22255
+Dernier commit: 2015-06-23 14:49:44 +0200
</text_version>
-<origine>svn://trac.rezo.net/spip/tags/spip-3.0.19</origine>
-<revision>22089</revision>
-<commit>2015-05-09 01:22:56 +0200 </commit>
+<origine>svn://trac.rezo.net/spip/tags/spip-3.0.20</origine>
+<revision>22255</revision>
+<commit>2015-06-23 14:49:44 +0200 </commit>
</svn_revision>
\ No newline at end of file